package com.xian.ai.code.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.xian.ai.code.constant.AppConstant;
import com.xian.ai.code.exception.ErrorCode;
import com.xian.ai.code.exception.ThrowUtils;
import com.xian.ai.code.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * @ClassName CodeFileSaveTemplate
 * @Description 文件保存的模板方法
 * @Author Zhangxn
 * @Version 1.0
 */
public abstract class CodeFileSaveTemplate <T>{
    // 文件保存根目录
    protected static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    public final File saveCode(T result,Long appId) {
        //校验输入
        validateInput(result);
        //生成唯一目录
        String baseDirPath = buildUniqueDir(appId);
        //写入文件
        saveFiles(result,baseDirPath);
        return new File(baseDirPath);

    }
    /**
     * 验证输入参数
     *
     * @param result 代码解析结果对象(可以被子类重写)
     */
    protected void validateInput(T result) {
        ThrowUtils.throwIf(result==null, ErrorCode.SYSTEM_ERROR,"代码解析结果不能为空");
    }



    /****
    * @description:
    * @param
    * @return String 返回唯一路径
    * @author Zhangxn
    * @date 2025/8/3
    */
    private  String buildUniqueDir(Long appId) {
        ThrowUtils.throwIf(appId==null, ErrorCode.PARAMS_ERROR,"appId不能为空");
        String codeType = getCodeType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", codeType, appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }
    /****
    * @description: 要被子类实现
    * @param
    * @return CodeGenTypeEnum 获得要生成的类型
    * @author Zhangxn
    * @date 2025/8/3
    */
    protected abstract CodeGenTypeEnum getCodeType();
    /****
    * @description: 保存result的结果到baseDirPath，要被子类实现
    * @param result
	* @param baseDirPath
    * @return void
    * @author Zhangxn
    * @date 2025/8/3
    */
    protected abstract void saveFiles(T result, String baseDirPath);

    /**
     * 写入单个文件
     *
     * @param dirPath 文件所在目录路径
     * @param filename 文件名
     * @param content  文件内容
     */
    public final void writeToFile(String dirPath, String filename, String content) {
        if (StrUtil.isNotBlank(content)) {
            String filePath = dirPath + File.separator + filename;
            FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
        }
    }
}
